* coding.c (CODING_ISO_FLAG_LEVEL_4): New macro.
authorK. Handa <handa@gnu.org>
Sat, 20 Jul 2013 04:16:07 +0000 (13:16 +0900)
committerK. Handa <handa@gnu.org>
Sat, 20 Jul 2013 04:16:07 +0000 (13:16 +0900)
(decode_coding_iso_2022): Check the single-shift area.  (Bug#8522)

src/coding.c

index e779197bbdedc0f465fc5c495c9b1cb8e97718e0..ad2042672b2cdb88d28ceb0e5cd77a97c2516966 100644 (file)
@@ -493,6 +493,8 @@ enum iso_code_class_type
 
 #define CODING_ISO_FLAG_USE_OLDJIS     0x10000
 
+#define CODING_ISO_FLAG_LEVEL_4                0x20000
+
 #define CODING_ISO_FLAG_FULL_SUPPORT   0x100000
 
 /* A character to be produced on output if encoding of the original
@@ -3733,7 +3735,9 @@ decode_coding_iso_2022 (struct coding_system *coding)
              else
                charset = CHARSET_FROM_ID (charset_id_2);
              ONE_MORE_BYTE (c1);
-             if (c1 < 0x20 || (c1 >= 0x80 && c1 < 0xA0))
+             if (c1 < 0x20 || (c1 >= 0x80 && c1 < 0xA0)
+                 || ((CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LEVEL_4)
+                     ? c1 >= 0x80 : c1 < 0x80))
                goto invalid_code;
              break;
 
@@ -3747,7 +3751,9 @@ decode_coding_iso_2022 (struct coding_system *coding)
              else
                charset = CHARSET_FROM_ID (charset_id_3);
              ONE_MORE_BYTE (c1);
-             if (c1 < 0x20 || (c1 >= 0x80 && c1 < 0xA0))
+             if (c1 < 0x20 || (c1 >= 0x80 && c1 < 0xA0)
+                 || ((CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_LEVEL_4)
+                     ? c1 >= 0x80 : c1 < 0x80))
                goto invalid_code;
              break;